package com.digitalchina.lxnsy.toolkit;

import androidx.annotation.Nullable;

import com.alibaba.fastjson.JSON;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.List;

/**
 * ================================================
 * 项目名称：杨凌农业大数据(数据采集)
 * 类描述：json解析工具类
 * 包名：com.digitalchina.bigdata.toolkit
 * 创建人：郑皓
 * 创建时间：2016/4/12 16:49
 * 修改备注：
 * ================================================
 */
public class FastJsonUtil {

    // private static String strError = "服务器返回格式错误";


    /**
     * 解析放回实体类  bodyKey  dataKey 可为空
     *
     * @param jsonStr 返回json数据
     * @param bodyKey body的键 一般为body 如果不为body则传入当前键
     * @param dataKey 同上
     * @param cls     需要返回的class
     * @param <T>     和上面对应
     * @return
     */
    public static <T> T getBean(String jsonStr,
                                @Nullable String bodyKey, @Nullable String dataKey, Class<T> cls) {
        try {
            String data, body;

            if (!StringUtil.isStrEmpty(bodyKey))
                body = new JSONObject(jsonStr).getString(bodyKey);
            else
                body = new JSONObject(jsonStr).toString();

            if (!StringUtil.isStrEmpty(dataKey))
                data = new JSONObject(body).getString(dataKey);
            else
                data = new JSONObject(body).toString();

            if (StringUtil.isStrEmpty(data))
                return null;

            return JSON.parseObject(data, cls);
        } catch (JSONException e) {
            return null;
        }
    }

    /**
     * 解析放回实体类  默认解析body
     *
     * @param jsonStr 返回json数据
     * @param dataKey 同上
     * @param cls     需要返回的class
     * @param <T>     和上面对应
     * @return
     * @dataKey 可为空
     */
    public static <T> T getBean(String jsonStr, @Nullable String dataKey, Class<T> cls) {
        try {
            String data, body;

            body = new JSONObject(jsonStr).getString("body");

            if (!StringUtil.isStrEmpty(dataKey))
                data = new JSONObject(body).getString(dataKey);
            else
                data = new JSONObject(body).toString();

            if (StringUtil.isStrEmpty(data))
                return null;

            return JSON.parseObject(data, cls);
        } catch (JSONException e) {
            return null;
        }
    }

    /**
     * 解析返回实体类 默认为json里body下的data
     *
     * @param jsonStr
     * @param cls
     * @param <T>
     * @return
     */
    public static <T> T getBean(String jsonStr, Class<T> cls) {
        try {
            String body = new JSONObject(jsonStr).getString("body");
            String data = new JSONObject(body).getString("data");
            return JSON.parseObject(data, cls);
        } catch (JSONException e) {
            return null;
        }
    }

    /**
     * 解析返回实体类 默认为json里body下的data
     *
     * @param jsonStr
     * @param cls
     * @param <T>
     * @return
     */
    public static <T> T getBeanData(String jsonStr, Class<T> cls) {
        return JSON.parseObject(jsonStr, cls);
    }

    /**
     * 解析返回List（泛型实体类） bodyKey  dataKey 可为空
     *
     * @param jsonStr 返回json数据
     * @param bodyKey body的键 一般为body 如果不为body则传入当前键
     * @param dataKey 同上
     * @param cls     需要返回的class
     * @param <T>     和上面对应
     * @return
     */
    public static <T> List<T> getListBean(String jsonStr,
                                          @Nullable String bodyKey, @Nullable String dataKey, Class<T> cls) {
        try {

            String body, data;

            if (!StringUtil.isStrEmpty(bodyKey))
                body = new JSONObject(jsonStr).getString(bodyKey);
            else
                body = new JSONObject(jsonStr).toString();

            if (!StringUtil.isStrEmpty(dataKey))
                data = new JSONObject(body).getString(dataKey);
            else
                data = new JSONObject(body).toString();

            return JSON.parseArray(data, cls);
        } catch (JSONException e) {
            return null;
        }
    }

    /**
     * 解析返回List（泛型实体类） 默认bodyKey为body  dataKey 可为空
     *
     * @param jsonStr 返回json数据
     * @param dataKey 同上
     * @param cls     需要返回的class
     * @param <T>     和上面对应
     * @return
     */
    public static <T> List<T> getListBean(String jsonStr, @Nullable String dataKey, Class<T> cls) {
        try {

            String body, data;
            body = new JSONObject(jsonStr).getString("body");

            if (!StringUtil.isStrEmpty(dataKey))
                data = new JSONObject(body).getString(dataKey);
            else
                data = new JSONObject(body).toString();

            return JSON.parseArray(data, cls);
        } catch (JSONException e) {
            return null;
        }
    }
    /**
     * 解析返回List（泛型实体类） 默认bodyKey为body  dataKey 可为空
     *
     * @param jsonStr 返回json数据
     * @param dataKey 同上
     * @param cls     需要返回的class
     * @param <T>     和上面对应
     * @return
     */
    public static <T> List<T> getListBeanRow(String jsonStr, @Nullable String dataKey, Class<T> cls) {
        try {

            String body, data;
            body = jsonStr;

            if (!StringUtil.isStrEmpty(dataKey))
                data = new JSONObject(body).getString(dataKey);
            else
                data = new JSONObject(body).toString();

            return JSON.parseArray(data, cls);
        } catch (JSONException e) {
            return null;
        }
    }


    /**
     * 解析返回List（泛型实体类） 默认为json里body下的data
     *
     * @param jsonStr
     * @param cls
     * @param <T>
     * @return
     */
    public static <T> List<T> getListBean(String jsonStr, Class<T> cls) {
        try {
            String body = new JSONObject(jsonStr).getString("body");
            String data = new JSONObject(body).getString("data");
            return JSON.parseArray(data, cls);
        } catch (JSONException e) {
            return null;
        }
    }
    public static <T> List<T> getListBeanNoKey(String jsonStr, Class<T> cls) {
            return JSON.parseArray(jsonStr, cls);
    }

    /**
     * 解析返回数据 默认为json里body下的String
     *
     * @param jsonStr
     * @return
     */
    public static String getString(String jsonStr, @Nullable String dataKey) {
        try {
            String body = new JSONObject(jsonStr).getString("body");
            return new JSONObject(body).getString(dataKey);
        } catch (JSONException e) {
            return null;
        }
    }

    public static String getString(String jsonStr) {
        try {
            String body = new JSONObject(jsonStr).getString("body");
            return new JSONObject(body).getString("data");
        } catch (JSONException e) {
            return null;
        }
    }

}
